
#include "Personaje.h"
#include "Coordenada.h"
#include <map>
#include <string>

#define CALL_MEMBER_FN(object, ptrToMember) ((object).*(ptrToMember))

using std::map;
using std::string;
typedef void (Coordenada::*metodo_t) ();

Personaje::Personaje() {
    
    movimientos["arriba"]    =  &Coordenada::incrementarY;
    movimientos["derecha"]   =  &Coordenada::incrementarX;
    movimientos["izquierda"] =  &Coordenada::decrementarX;
    movimientos["abajo"]     =  &Coordenada::decrementarY;
    movimientos["ninguna"]   =  nullptr;
}

Personaje::~Personaje(){    
}

bool Personaje::estaVivo(){
    return vive;
}

void Personaje::setDireccion(string dir){
    direccion = dir;
}

void Personaje::mover(){
	/* COMPLETAR. */
    if ((movimientos.count(direccion) > 0) || (direccion != "ninguna")) {
        posicionAnterior = posicion;
        CALL_MEMBER_FN(posicion, movimientos[direccion]) ();
    }
    direccion = "ninguna";
}

void Personaje::retroceder() {
    posicion = posicionAnterior;
}

void Personaje::ubicar(Coordenada coord){
    posicion = coord;
}

void Personaje::destruir(){
	//tdv no se que va aca.
	vive = false;
}

Coordenada Personaje::getPosicion(){
	return posicion;
}

void Personaje::colisionarConBombaPlanta(){
	//depende del personaje
}

void Personaje::colisionarConBomberman(IOcupante* bomberman){
	//No pasa nada
}

void Personaje::colisionarConEnemigo(){
	//No pasa nada excepto que se trate de un Bomberman.
}

void Personaje::colisionarConPlanta(){
	//No pasa nada.
}


